package com.bxait.toymail.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/***
 * TODO:
 * springBoot整合Redis产生的问题
 *   我们整合redis 导入了<spring-boot-starter-data-redis>  产生的堆外内存溢出问题
 *   springBoot2.0之后整合redis是使用的lettuce来操作客户端
 *      而lettuce是使用netty作为网络通信     <netty-version>4.1.38.Final</netty-version>
 *      lettuce和netty没有整合好,导致了堆外内存溢出问题
 *      netty如果没有指定堆外内存空间,就会使用我们配置的-Xmx就会内存分配不足造成堆外内存溢出
 *      就算我们将内存调大,但是我们还是会出现堆外内存溢出 愿意就是我们没有及时的释放内存
 *
 *      PlatformDependent
 *      DIRECT_MEMORY_COUNTER.addAndGet((long)capacity);(383)
 *      netty的底层会自己将需要使用的内存进行计数,计数当超过我们配置的直接内存限制  可以通过-Dio.netty.maxDirectMemory(928)进行设置
 *      netty的源代码
 *      long newUsedMemory = DIRECT_MEMORY_COUNTER.addAndGet((long)capacity);
 *             if (newUsedMemory > DIRECT_MEMORY_LIMIT) {
 *                 DIRECT_MEMORY_COUNTER.addAndGet((long)(-capacity));
 *                 throw new OutOfDirectMemoryError("failed to allocate " +
 *                 capacity + " byte(s) of direct memory (used: " + (newUsedMemory - (long)capacity) + ", max: " + DIRECT_MEMORY_LIMIT + ')');
 *             }
 *     解决方案1.不能只是使用-Dio.netty.maxDirectMemory来进行设置,这是不管用的
 *              升级lettuce(吞吐量大)
 *    解决方案2.切换使用jedis
 *    最终选择解决方案:
 *          切换使用jedis来操作redis()
 *          排除lettuce使用jedis来操作redis
 *
 * lettuce、jedis是操作redis底层客户端,spring在此封装了StringRedisTemplate
 *
 */
@EnableRedisHttpSession
@EnableFeignClients("com.bxait.toymail.product.feign")
@EnableDiscoveryClient
@SpringBootApplication
public class ToyMailProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(ToyMailProductApplication.class, args);
    }

}
